#include "../inc/swipedetector.h"
#include <cmath>
#include <iostream>


const char* SwipeDetector::TOUCH_DEVICE = "/dev/input/event0";

// 在swipedetector.cpp中添加方法实现
/**
 * @brief 重置触摸状态
 * 
 * 重置所有触摸相关的状态变量，包括坐标、时间和触摸状态标志
 */
void SwipeDetector::resetTouchState() 
{
    // 设置非阻塞模式，避免读取时阻塞
    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
    // 设置阻塞模式，清空缓冲区中的事件
    struct input_event ev;
    while (read(fd, &ev, sizeof(ev)) > 0);
    // 恢复阻塞模式
    fcntl(fd, F_SETFL, flags);

    // 重置状态变量
    startX = startY = endX = endY = 0;
    startTime = 0;
    DeltaX = DeltaY = 0;
    touchDown = false;
}

/**
 * @brief SwipeDetector的构造函数
 *
 * 初始化SwipeDetector对象，打开触摸屏设备文件并设置初始状态。
 *
 * @details 该构造函数将尝试打开指定的触摸屏设备文件，并设置初始的触摸开始位置和时间。
 * 如果无法打开设备文件，将输出错误信息。
 */
SwipeDetector::SwipeDetector() : fd(-1), startX(0), startY(0), startTime(0), touchDown(false) {
    fd = open(TOUCH_DEVICE, O_RDONLY);
    if (fd == -1) 
    {
        perror("[error] swipe detector open");
    }
}

/**
 * @brief SwipeDetector类的析构函数
 *
 * 在析构函数中，如果文件描述符fd不为-1，则关闭文件描述符fd
 */
SwipeDetector::~SwipeDetector() 
{
    if (fd != -1) 
    {
        close(fd);
    }
}



/**
 * @brief 检测滑动方向
 *
 * 检测用户的滑动方向，包括上、下、左、右四个方向。
 *
 * @return 返回滑动方向，如果未检测到滑动，则返回NONE。
 */
SwipeDetector::Direction SwipeDetector::detectSwipe() 
{
    struct input_event ev;
    Direction result = NONE;
    
    while (read(fd, &ev, sizeof(ev)) > 0) 
    {
        // 处理坐标事件（X/Y轴）
        if (ev.type == EV_ABS) 
        {
            if (ev.code == ABS_X) 
            {
                // 更新X坐标（滑动和点击都会更新）
                endX = ev.value;
                DeltaX = ev.value * 800 / 1024;  // 换算到目标分辨率
                if (touchDown && startX == 0) 
                {
                    startX = endX;  // 如果是触摸状态，初始化起点X
                }
            } 
            else if (ev.code == ABS_Y) 
            {
                // 更新Y坐标（滑动和点击都会更新）
                endY = ev.value;
                DeltaY = ev.value * 480 / 600;   // 换算到目标分辨率
                if (touchDown && startY == 0) 
                {
                    startY = endY;  // 如果是触摸状态，初始化起点Y
                }
            }
        }
        
        // 处理触摸按下/释放事件
        if (ev.type == EV_KEY && ev.code == BTN_TOUCH) 
        {
            // 按下事件
            if (ev.value == 1) 
            {
                touchDown = true;// 标记触摸状态
                startTime = ev.time.tv_sec * 1000000 + ev.time.tv_usec;// 记录触摸开始时间
                // 重置起点坐标，准备记录新触摸
                startX = startY = endX = endY = 0;
            } 
            // 释放事件
            else 
            {
                if (touchDown) 
                {
                    long endTime = ev.time.tv_sec * 1000000 + ev.time.tv_usec;
                    int deltaX = endX - startX;
                    int deltaY = endY - startY;
                    long duration = endTime - startTime;
                    
                    // 判断是否是有效的滑动（快速移动）
                    if (duration < TIME_THRESHOLD && 
                        (std::abs(deltaX) > SWIPE_THRESHOLD || std::abs(deltaY) > SWIPE_THRESHOLD)) 
                    {
                        // 判断主要滑动方向
                        if (std::abs(deltaX) > std::abs(deltaY)) 
                        {
                            result = (deltaX > 0) ? RIGHT : LEFT;
                        } 
                        else 
                        {
                            result = (deltaY > 0) ? DOWN : UP;
                        }
                    }
                    // 否则是点击（DeltaX/Y 已经被更新）
                }
                
                touchDown = false;// 重置触摸状态，准备下一次滑动检测
                break;
            }
        }
    }
    
    return result;
}


// int main() {
//     // 创建滑动检测器实例
//     SwipeDetector detector;
    
//     while (true) {
//         // 检测滑动方向
//         SwipeDetector::Direction direction = detector.detectSwipe();
        
//         switch (direction) {
//             case SwipeDetector::UP:
//                 std::cout << "检测到向上滑动" << std::endl;
//                 break;
//             case SwipeDetector::DOWN:
//                 std::cout << "检测到向下滑动" << std::endl;
//                 break;
//             case SwipeDetector::LEFT:
//                 std::cout << "检测到向左滑动" << std::endl;
//                 break;
//             case SwipeDetector::RIGHT:
//                 std::cout << "检测到向右滑动" << std::endl;
//                 break;
//             case SwipeDetector::NONE:
//                 // 没有滑动，检查是否是点击
//                 if (detector.getDeltaX() != 0 || detector.getDeltaY() != 0) {
//                     std::cout << "检测到点击，坐标: (" 
//                               << detector.getX() << ", " 
//                               << detector.getY() << ")" << std::endl;
//                     // 重置坐标，准备下一次检测
//                     detector.setXY(0, 0);
//                 }
//                 break;
//         }
        
//         // 短暂休眠，避免CPU占用过高
//         usleep(10000); // 10ms
//     }
    
//     return 0;
// }

